package com.travel.controller.user;

import com.travel.common.UserContext;
import com.travel.entity.dto.ChatMessageDTO;
import com.travel.entity.vo.ChatResponseVO;
import com.travel.result.Result;
import com.travel.service.ChatService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

/**
 * 聊天控制器
 * 所有接口通过UserContext获取用户信息，不需要在请求中提供userId
 * 所有会话管理通过sessionId进行，在首次请求中可以不提供，系统会自动创建
 */
@RestController
@RequestMapping("/user/chat")
@RequiredArgsConstructor
@Api(tags = "聊天接口")
@Slf4j
public class ChatController {

    private final ChatService chatService;

    /**
     * 发送消息给AI助手
     * 用户信息从UserContext中获取，不需要在请求中提供
     * @param chatMessage 聊天消息
     * @return AI助手回复
     */
    @PostMapping("/send")
    @ApiOperation("发送消息给AI助手")
    public Result<String> sendMessage(@RequestBody ChatMessageDTO chatMessage) {
        log.info("接收到聊天请求: {}", chatMessage.getMessage());
        // 验证用户是否已登录
        if (UserContext.getUserId() == null) {
            return Result.fail(401, "用户未登录");
        }
        
        String  response = chatService.sendMessage(chatMessage);
        return Result.success(response);
    }
    
    /**
     * 发送消息给AI助手并流式返回结果
     * 用户信息从UserContext中获取，不需要在请求中提供
     * @param chatMessage 聊天消息
     * @return 服务器发送事件流
     */
    @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ApiOperation("发送消息给AI助手并流式返回结果")
    public SseEmitter sendMessageStream(@RequestBody ChatMessageDTO chatMessage) {
        log.info("接收到流式聊天请求: {}", chatMessage.getMessage());
        // 验证用户是否已登录
        if (UserContext.getUserId() == null) {
            throw new com.travel.exception.BusinessException("用户未登录");
        }
        
        return chatService.sendMessageStream(chatMessage);
    }


} 